<!DOCTYPE html>
<html lang="en">

<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport">
	
	<!-- title -->
	
	<title>
	
		04.从一条短信开始 | 
	 
	对线面试官
	</title>
	
	<!-- keywords,description -->
	 
		<meta name="description" content="Java一线大厂面试" />
	

	<!-- favicon -->
	
	<link rel="shortcut icon" href="/luffy/favicon.ico">
	


	<!-- search -->
	<script>
		var searchEngine = "https://www.baidu.com/s?wd=";
		if(typeof searchEngine == "undefined" || searchEngine == null || searchEngine == ""){
			searchEngine = "https://www.google.com/search?q=";
		}
		var homeHost = "";
		if(typeof homeHost == "undefined" || homeHost == null || homeHost == ""){
			homeHost = window.location.host;
		}
	</script>


	
<link rel="stylesheet" href="/luffy/css/main.css">

	
<link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/4.7.0/css/font-awesome.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/styles/darcula.min.css">

	
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css">


	
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@9.17.1/build/highlight.min.js"></script>

	
<script src="https://cdn.jsdelivr.net/npm/jquery-pjax@2.0.1/jquery.pjax.min.js"></script>

	
<script src="/luffy/js/main.js"></script>

	
		
<script src="https://cdn.jsdelivr.net/npm/leancloud-storage/dist/av-min.js"></script>

		
<script src="https://cdn.jsdelivr.net/npm/valine@1.3.10/dist/Valine.min.js"></script>

	
	
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
	<script>
var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?3efe99c287df5a1d6f0d02d187e403c1";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script>

<header id="header">
    <a id="title" target="_blank" rel="noopener" href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzU4NzA3MTc5Mg==&action=getalbum&album_id=1657204970858872832&scene=126#wechat_redirect" class="logo">对线面试官</a>

	<ul id="menu">
		
	

	

		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				【戳这里】获取更多原创干货💪💪
			</a>
		</li>
		<li class="menu-item">
			<a href="https://gitee.com/zhongfucheng/Java3y" class="menu-item-link" target="_blank">
				<i class="fa fa-github fa-2x"></i>
			</a>
		</li>
	</ul>
</header>

	
<div id="sidebar">
	<button id="sidebar-toggle" class="toggle" ><i class="fa fa-arrow-right " aria-hidden="true"></i></button>
	
	<div id="site-toc">
		<input id="search-input" class="search-input" type="search" placeholder="按回车全站搜索">
		<div id="tree">
			

			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										00-面试前准备
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/00-%E9%9D%A2%E8%AF%95%E5%89%8D%E5%87%86%E5%A4%87/01.%E7%AE%80%E5%8E%86/">
										01.简历
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										01-Java基础
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/01.%20%E6%B3%A8%E8%A7%A3/">
										01. 注解
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/02.%20%E6%B3%9B%E5%9E%8B/">
										02. 泛型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/03.%20JavaNIO/">
										03. JavaNIO
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/01-Java%E5%9F%BA%E7%A1%80/04.%20%E5%8F%8D%E5%B0%84%E5%92%8C%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/">
										04. 反射和动态代理
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										02-Java并发
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/01.%20%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%9F%BA%E7%A1%80/">
										01. 多线程基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/02.%20CAS/">
										02. CAS
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/03.%20synchronized/">
										03. synchronized
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/04.%20AQS%E5%92%8CReentrantLock/">
										04. AQS和ReentrantLock
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/05.%20%E7%BA%BF%E7%A8%8B%E6%B1%A0/">
										05. 线程池
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/06.%20ThreadLocal/">
										06. ThreadLocal
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/07.%20CountDownLatch%E5%92%8CCyclicBarrier/">
										07. CountDownLatch和CyclicBarrier
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/08.%20%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81Java%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										08. 为什么需要Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/02-Java%E5%B9%B6%E5%8F%91/09.%20%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BAJava%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/">
										09. 深入浅出Java内存模型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										03-Java容器
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/01.%20List%E9%9B%86%E5%90%88/">
										01. List集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/03-Java%E5%AE%B9%E5%99%A8/02.%20Map%E9%9B%86%E5%90%88/">
										02. Map集合
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										04-Java虚拟机
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/01.%20Java%E7%BC%96%E8%AF%91%E5%88%B0%E6%89%A7%E8%A1%8C%E7%9A%84%E8%BF%87%E7%A8%8B/">
										01. Java编译到执行的过程
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/02.%20%E5%8F%8C%E4%BA%B2%E5%A7%94%E6%B4%BE%E6%9C%BA%E5%88%B6/">
										02. 双亲委派机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/03.%20JVM%E5%86%85%E5%AD%98%E7%BB%93%E6%9E%84/">
										03. JVM内存结构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/04.%20%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6/">
										04. 垃圾回收机制
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/05.%20CMS%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										05. CMS垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/06.%20G1%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8/">
										06. G1垃圾收集器
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/24/04-Java%E8%99%9A%E6%8B%9F%E6%9C%BA/07.%20JVM%E8%B0%83%E4%BC%98/">
										07. JVM调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										05-Spring
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/01.%20SpringMVC/">
										01. SpringMVC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/02.%20Spring%E5%9F%BA%E7%A1%80/">
										02. Spring基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/05-Spring/03.%20SpringBean%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F/">
										03. SpringBean生命周期
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										06-Redis
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/01.%20Redis%E5%9F%BA%E7%A1%80/">
										01. Redis基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/06-Redis/02.%20Redis%E6%8C%81%E4%B9%85%E5%8C%96/">
										02. Redis持久化
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/03.%20Redis%E4%B8%BB%E4%BB%8E%E6%9E%B6%E6%9E%84/">
										03. Redis主从架构
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/06-Redis/04.%20Redis%E5%88%86%E7%89%87%E9%9B%86%E7%BE%A4/">
										04. Redis分片集群
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										07-消息队列
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/01.%20Kafka%E5%9F%BA%E7%A1%80/">
										01. Kafka基础
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/07-%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/02.%20%E4%BD%BF%E7%94%A8Kafka%E4%BC%9A%E8%80%83%E8%99%91%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98/">
										02. 使用Kafka会考虑什么问题
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										08-MySQL
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/01.%20MySQL%E7%B4%A2%E5%BC%95/">
										01. MySQL索引
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/02.%20MySQL%E4%BA%8B%E5%8A%A1%E5%92%8C%E9%94%81%E6%9C%BA%E5%88%B6%E5%92%8CMVCC/">
										02. MySQL事务和锁机制和MVCC
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/19/08-MySQL/03.%20MySQL%E8%B0%83%E4%BC%98/">
										03. MySQL调优
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										09-项目场景类
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/01.%20%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E5%8E%BB%E9%87%8D%E5%92%8C%E5%B9%82%E7%AD%89/">
										01. 如何实现去重和幂等
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/02.%20%E7%B3%BB%E7%BB%9F%E9%9C%80%E6%B1%82%E5%A4%9A%E5%8F%98%E5%A6%82%E4%BD%95%E8%AE%BE%E8%AE%A1/">
										02. 系统需求多变如何设计
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/20/09-%E9%A1%B9%E7%9B%AE%E5%9C%BA%E6%99%AF%E7%B1%BB/03.%20%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">
										03. 设计模式
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										10-计算机网络
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/08/25/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/01.%20HTTP/">
										01. HTTP
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/13/10-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/02.TCP%E4%B8%89%E6%AC%A1%E6%8F%A1%E6%89%8B%E5%92%8C%E5%9B%9B%E6%AC%A1%E6%8C%A5%E6%89%8B/">
										02.TCP三次握手和四次挥手
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										11-算法
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/01/11-%E7%AE%97%E6%B3%95/01.%20%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/">
										01. 排序算法
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Easy/">
										02. LeetCode Easy
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/09/02/11-%E7%AE%97%E6%B3%95/02.%20LeetCode%20Medium/">
										02. LeetCode Medium
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
							<ul>
								<li class="directory">
									<a href="#" class="directory">
										<i class="fa fa-plus-square-o"></i>
										12-austin项目
									</a>
									
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/01/12-austin%E9%A1%B9%E7%9B%AE/00.%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/">
										00.项目介绍
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/01.%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										01.环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/10/30/12-austin%E9%A1%B9%E7%9B%AE/02.%E6%97%A5%E5%BF%97/">
										02.日志
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/03.%E5%B7%A5%E5%85%B7%E5%8C%85/">
										03.工具包
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file active">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/04.%E4%BB%8E%E4%B8%80%E6%9D%A1%E7%9F%AD%E4%BF%A1%E5%BC%80%E5%A7%8B/">
										04.从一条短信开始
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/05.%E9%80%89%E6%8B%A9%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B/">
										05.选择数据库和技术选型
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/06.MySQL%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										06.MySQL环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
							<ul>
								<li class="file">
									<a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/07.Kafka%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/">
										07.Kafka环境搭建
									</a>
								</li>
								<div class="article-toc" style="display: none;"></div>
							</ul>
			
								</li>
								
							</ul>
			
		</div>
	</div>
</div>

	<!-- 引入正文 -->
	<div id="content">
		<h1 id="article-title">

	04.从一条短信开始
</h1>
<div class="article-meta">
	
	<span>3y</span>
	<span>2021-11-24 08:36:16</span>
		<div id="article-categories">
    
		<span>Categories：</span>
            
    

    
		<span>Tags：</span>
            
    
		</div>

</div>

<div id="article-content">
	<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501926&idx=1&sn=9fd2996baa50ce04c3569c490e15299c&chksm=ebd48967dca30071126d6d1d3f5eb08cf8a0d818a3c951c7dcc6bedb3c124f3d0c5166622379&token=358461825&lang=zh_CN#rd">第零篇</a>简单介绍了austin项目做什么用的，这两个月我重点会实现哪一块内容。</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501892&idx=1&sn=9352f83e2a15003fb5ea61b83c569680&chksm=ebd48945dca3005371df9858c9347cea95b7a1424eb290659b781d3e07704b3207a3fce5126d&token=358461825&lang=zh_CN#rd">第一篇</a>用Maven+SpringBoot搭好了项目的架子，以及聊了下我对SpringBoot和Maven的看法。</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247501980&idx=1&sn=f2cb49ee1e40e529f31e588b062a1a23&chksm=ebd4899ddca3008b67bab1599edb5184b993c96806c6efee750863a6f7b46e6e54f1f72a4be0&token=970948001&lang=zh_CN#rd">第二篇</a>聊了下很容易被大家忽略的日志（这在项目中是非常重要的）</p>
<p><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247502034&idx=1&sn=9d673454afe83c2d4d516d22ff847ebf&chksm=ebd489d3dca300c5587f1a4b18c8a44cacf78b824aeda7ad08b1553aefdc5afad80f1b1e8bc5&token=1347092722&lang=zh_CN#rd">第三篇</a>推荐了些经常用到的工具包（简化我们的开发也能提高代码的可读性）</p>
<p>这是austin项目系列的第四篇了，今天不能再是「新建文件夹」状态了，austin项目需要真正地写代码了！</p>
<p>这一篇就直接上手：<strong>从发送短信开始</strong></p>
<h2 id="01、短信介绍"><a href="#01、短信介绍" class="headerlink" title="01、短信介绍"></a>01、短信介绍</h2><p>在项目介绍的时候，已经定义了austin项目的<strong>核心功能</strong>：发送消息</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvztdk1w2wj30ky0p8759.jpg"></p>
<p>我认为，短信是在一整个消息推送平台里最重要的一个消息类型了（毕竟关联了很多重要的业务场景），想想我们日常使用APP时的场景：</p>
<ul>
<li><strong>验证码</strong>：登录注册、支付等等重要场景</li>
<li><strong>通知类</strong>：用户订单信息、重要信息通知用户、重要信息通知商家等等场景</li>
<li>营销类：运营在特定时间内发送营销短信，影响业务的KPI指标完成（不过这个相对就没那么重要）</li>
<li>…</li>
</ul>
<p>（试想下，如果系统挂了10分钟，会怎么样）</p>
<p>发送短信在消息推送平台里<strong>比较容易实现</strong>的一种消息类型了，我会在这篇文章中<strong>让你体会</strong>发送消息<strong>如果要做得比较好也并没有那么的简单和容易</strong>，以及能够体会到<strong>为什么我在介绍austin项目的时候需要引入那么多的中间件</strong>。</p>
<p>（一切从一条短信开始）</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvzxrppbb0j30ym0iaq8v.jpg"></p>
<h2 id="02、发送短信必要准备"><a href="#02、发送短信必要准备" class="headerlink" title="02、发送短信必要准备"></a>02、发送短信必要准备</h2><p>隔着上次的系统架构图也有好几天了，先复习下我们austin系统的整个流程</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gvzx4f1iwoj31le0rs0uy.jpg"></p>
<p>由于是<strong>初步实现</strong>，所以我先开个接口直接调用<code>austin-handler</code>模块，只要在<code>austin-handler</code>模块下实现发送短信的逻辑就好了。</p>
<p>我们要发送短信，一般直接接入<strong>短信渠道商</strong>就好了。以我的理解，发短信的过程是这样的：</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw6mh2fb7aj31o20temzt.jpg"></p>
<p>正好前几天在群里，有个兄弟的就是在公司做短信渠道商的相关业务的。他说接口有20W QPS并发量（之前在搞各种的中间件优化避免消息的堆积），他进去了才知道发送一条短信原来是会经过这么多的流程（<strong>我复制下他原话</strong>）</p>
<blockquote>
<p>我现在才知道，原来一条短信发到我们手机，经过了不知道多少流程，包括黑名单检查风控检查，关键字检查，退订检查，模板检查，客户账号检查，路由网关检查，通道检查，状态报告检查，运营商检查。。。。。。。</p>
</blockquote>
<p>一般我们要去评估是否使用某短信渠道商来发送，考量的点有两个：<strong>成本和成功率</strong>。这里应该还是比较好理解的，短信渠道商有很多，他们都需要赚钱，我们作为接入方需要省钱（那自然就有有价格的差异性）。如果某一个渠道商又便宜发送成功率又高，那当然用他作为主要渠道啊！</p>
<p>这次我选择的是腾讯云作为austin项目下<strong>初步</strong>发送短信的渠道商。</p>
<p>我这次选择的理由很简单：我进去短信产品了以后，他免费给了我100条发送短信的体验卡（应该是人人都有的？我不可能是天命之子吧）。</p>
<blockquote>
<p>我发现有很多小伙伴在跟着我的步伐在做的，我肯定不能把自己的短信账号和密码直接公开给大家体验的。所以到时候你们感兴趣可以用自己的账号体验一波。</p>
</blockquote>
<p>麻烦**@腾讯云<strong>给我打下广告费。</strong>@阿里云<strong>貌似有？（但入口太难找，罢了）</strong>@华为云**我还没登录体验过，等等我！</p>
<p>想要发送一条短信又或是接入一个短信渠道商必不可少的两个点：<strong>短信模板</strong>和<strong>短信签名</strong>。看不懂？没事，我以具体的一条测试短信为例：</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw6nhlvce9j30n00ceaba.jpg"></p>
<p>有了<strong>短信签名</strong>可以让用户知道这可能是谁发过来的短信，有了<strong>短信模板</strong>可以让发送垃圾短信的概率大大减少。</p>
<p>有人可能就会问了：那我每发一条短信，都需要有对应模板的话，那我维护起来不就非常麻烦？这毕竟是一个推送平台啊！每次有业务需要发送新的文案，还得去对应的渠道商后台申请模板吗？</p>
<p>本来我以为这是正常的，<strong>没想到，如果你是公司的话，还能谈的</strong>（🐶一般人我还不告诉他）。所以，可能会有<strong>通用短信模板</strong>的存在。</p>
<p>但不管怎么样，短信渠道商还是会校验各种逻辑（该验证的还是会验证，你乱发消息把你的账号给限流和设置抽样人工验证文案，这样就得不偿失了）</p>
<h2 id="03、功能实现"><a href="#03、功能实现" class="headerlink" title="03、功能实现"></a>03、功能实现</h2><p>调用第三方API可能会有两种选择：<strong>HTTP调用</strong>和<strong>内嵌SDK</strong>（如果平台方有做SDK的话）。</p>
<p>我以前一般都是直接HTTP调用的，因为这样我的代码就不用内嵌别人家的SDK了（内嵌SDK意味着会引入其他依赖）。于是我就直接从他提供接入文档入手，尝试使用HTTP进行接入。</p>
<p>嗯，我花了两天多，还没接入成功。我直呼顶不住，再这样下去，催更的人都要来我家敲门了！</p>
<p>腾讯云接口用HTTP验签也太太太复杂了吧！原来他的<strong>注</strong>不是在吓唬我：</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw6o5f8pgmj314k0byjtm.jpg"></p>
<p>我搞了两个晚上已经心灰意冷了，只能妥协用他们提供的SDK了，再加上自动生成代码，嘎嘎很快地就成功了（我好奇有没有勇士曾经按照最新的API文档用HTTP接入过他们的接口）</p>
<p>具体的代码我就不贴了，按照惯例大家在文末(<strong>阅读原文</strong>)找到Gitee链接🔗看就好了。</p>
<blockquote>
<p>跟着项目做的小伙伴，只要在配置文件改下账号信息和调用下接口，就能收到自己的短信了。（问题应该不大，有问题来群里问就好了）</p>
</blockquote>
<h2 id="04、为什么austin是消息平台"><a href="#04、为什么austin是消息平台" class="headerlink" title="04、为什么austin是消息平台"></a>04、为什么austin是消息平台</h2><p>实现发送短信是一件很简单的事（从它占文章篇幅即可推断出），发送其他渠道的消息其实也很简单。<strong>从本质上讲</strong>，就是对接API调用发送接口进行发送。</p>
<p>作为一般项目，发完消息就没有后续了，但如果作为一个「平台」而言，这是远远不够的。</p>
<p><strong>4.1 调用发送短信接口后，如果用户反馈收不到怎么办？</strong></p>
<p>我们只调用了发送短信的接口，没有记录接口的返回信息（也就没有发送凭证），当别人找过来的时候，我们也无济于事（我们什么都没记录，什么都不知道）。</p>
<p><strong>解决方案</strong>：我们需要<strong>存储</strong>把发送的记录给存起来，也需要有接口把短信的回执拉回来并存储，并在推送后台提供相关的页面给予快速查询。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gw98xmeevxj31a80nytb6.jpg"></p>
<p><strong>4.2 某个短信渠道商挂了怎么办？</strong></p>
<p>别以为我们的依赖是阿里云、腾讯云或者华为云这种大公司，他们提供的产品不是万无一失的，挂也是很正常的事。那如果我们只依赖一个短信渠道，它挂了，是不是相当于我们就挂了。</p>
<p><strong>解决方案</strong>：短信需要接入多个渠道商，调用接口失败需要继续调用其他渠道商，支持<strong>动态分配</strong>渠道商的流量（一旦有提前预警，直接切换渠道商）</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwaanrbuhfj316i0u0jtc.jpg"></p>
<p><strong>4.3 这个月短信花了多少钱，我怎么知道？</strong></p>
<p>接入的短信后台都有对应的统计，但我们量大的话是需要「对账」，以我们的<strong>发送记录与回执</strong>统计跟短信的后台进行统计。</p>
<p>毕竟都是钱啊，不能全部信他们的啊。我曾经就有遇到过，对方的账单跟我们自己统计的数量有比较大的出入，后来排查发现他们的统计是存在问题的。</p>
<p><strong>解决方案</strong>：将短信的发送和回执数据导入到Hive，每个月跑一次Hive脚本统计进行对账</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwab4u2h9hj318c0dkq3w.jpg"></p>
<p><strong>4.4 现在调用短信的量大吗？</strong></p>
<p>第三方接口一般都会有限流的，比如在腾讯云官网上看到对发送接口有3000QPS的限制。<strong>我们是需要知道现在各种类型的消息的发送情况是怎么样的，是否有限流的操作</strong>。如果限流了，是不是可以告诉业务方可能是原因目前发送量过大导致触发限流。</p>
<p>系统上有完备的监控，你知道了各种的系统指标数据，自己才不会慌。（排查问题有监控会很容易定位）</p>
<p>要是某一天有人跟你说你的系统挂了，你不会还傻乎乎地去服务器上看日志吧？打开监控看下有没有流量，流量正不正常不就一眼就能看到了吗。</p>
<p><strong>解决方案</strong>：监控从接口调用到消息下发整个过程的数据（主要是接口QPS和下发人数）</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwabsp8xb8j31fu0n8wh8.jpg"></p>
<p><strong>4.5 业务方不小心连续发了两次怎么办？</strong></p>
<p>业务方使用不当，不小心连续推送了两次，如果没有任何限制，那就真的下发了两次。试想下，如果你点了下验证码，霎时间，收到了两条一模一样的短信，你是什么感受？</p>
<p><strong>解决方案</strong>：作为平台需要有这种<strong>兜底</strong>的功能（尽可能避免由于业务使用不恰当，导致出现事故）</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwacrab4arj30ra0ik0to.jpg"></p>
<p><strong>4.6 这条短信谁发的啊？</strong></p>
<p>客服反馈：用户接收到了一条短信（用户对具体短信的细节不理解）。客服看着短信也两眼懵逼，公司那么大，不知道由哪个业务团队下发出来的。现在只有短信的文案，怎么能快速找到下发短信的团队呢。</p>
<p>我们需要让所有经过austin项目的消息都有一个「载体」（说白了就是模板），有了模板之后，业务方在接入的时候需要填写各类的信息，有了这些信息再配合搜索引擎就可以快速定位出信息。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwaf54k4xqj31ms0ma40v.jpg"></p>
<p>“<strong>溯源</strong>“在很多时候都很有用（比如：你提供了一个HTTP接口，如果没对业务做任何的限制。或许有朝一日，你希望对该接口进行大改动，但你不知道现在有谁进行调用，就会很头疼）</p>
<p><strong>解决方案</strong>：给接入方套”模板“，有了模板才能溯源，才能做数据追踪，<strong>模板是作为平台的基石</strong>。（下一篇等我建表的时候，我会再来跟大家详细说说对应的业务）</p>
<p><strong>4.7 经常要接入短信渠道怎么办？</strong></p>
<p>商务又找到了便宜的短信渠道了，接入一下看看效果吧？这可是实打实省钱的啊！每次写一个类（接入短信就相当于写一个类），我都要重启发布上线吗？这不靠谱吧？</p>
<p><strong>解决方案</strong>：上规则引擎将业务代码抽离，无须上下线即可实现功能。</p>
<p><img src="https://tva1.sinaimg.cn/large/008i3skNgy1gwafj6p9z1j30nu0ku75o.jpg"></p>
<h2 id="05、总结"><a href="#05、总结" class="headerlink" title="05、总结"></a>05、总结</h2><p><strong>实现功能很简单，但在实现功能的过程中代码的健壮性、稳定性以及灵活性如果你都考虑到了，那面试的过程中还怕什么</strong>？出去面试，就说我基于现有的场景引入了分布式配置中心，大大提高了工作效率。出去面试，就说我对整个系统进行完备的监控和告警，在这个过程中线上无任何故障，平时遇到问题，我的解决思路是怎么样的等等等。</p>
<p>这篇文章其实也相当于是“预告”，这些功能我后面都会一一进行实现（当然了，我的小目标也不仅仅上面所提到的如此）</p>
<p>Gitee链接：<a target="_blank" rel="noopener" href="https://gitee.com/zhongfucheng/austin">https://gitee.com/zhongfucheng/austin</a></p>
<p>GitHub链接：<a target="_blank" rel="noopener" href="https://github.com/ZhongFuCheng3y/austin">https://github.com/ZhongFuCheng3y/austin</a></p>

</div>


    <div class="post-guide">
        <div class="item left">
            
              <a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/05.%E9%80%89%E6%8B%A9%E6%95%B0%E6%8D%AE%E5%BA%93%E5%92%8C%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B/">
                  <i class="fa fa-angle-left" aria-hidden="true"></i>
                  05.选择数据库和技术选型
              </a>
            
        </div>
        <div class="item right">
            
              <a href="/luffy/2021/11/24/12-austin%E9%A1%B9%E7%9B%AE/03.%E5%B7%A5%E5%85%B7%E5%8C%85/">
                03.工具包
                <i class="fa fa-angle-right" aria-hidden="true"></i>
              </a>
            
        </div>
    </div>




<script>
	
	
</script>
	</div>
	<button id="totop-toggle" class="toggle"><i class="fa fa-angle-double-up" aria-hidden="true"></i></button>
</body>
</html>
